home *** CD-ROM | disk | FTP | other *** search
- /*********************************************************************
- Project : MacPerl - Real Perl Application
- File : MPScript.c - Handle scripts
- Author : Matthias Neeracher
- Language : MPW C
-
- $Log: MPScript.c,v $
- Revision 1.2 1994/05/04 02:54:19 neeri
- Always keep the right resource file in front.
-
- Revision 1.1 1994/02/27 23:01:56 neeri
- Initial revision
-
- Revision 0.2 1993/10/14 00:00:00 neeri
- Run front window
-
- Revision 0.1 1993/08/17 00:00:00 neeri
- Set up correct default directory
-
- *********************************************************************/
-
- #define ORIGINAL_WRAPPER
-
- #ifdef RUNTIME
- /* This is not merely my personal opinion. SegLoad.h now requires this */
- #define OBSOLETE
-
- #include <SegLoad.h>
- #endif
-
- #include <AERegistry.h>
- #include <String.h>
- #include <TFileSpec.h>
- #include <sys/types.h>
- #include <ctype.h>
- #include <stdio.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <Signal.h>
- #include <StandardFile.h>
- #include <Resources.h>
- #include <PLStringFuncs.h>
- #include <LowMem.h>
- #include <FragLoad.h>
- #include <AEBuild.h>
- #include <AEStream.h>
- #include <AESubDescs.h>
- #include <OSA.h>
-
- #include "MPScript.h"
- #include "MPWindow.h"
- #include "MPAppleEvents.h"
- #include "MPAEVTStream.h"
- #include "MPFile.h"
- #include "MPSave.h"
- #include "MPMain.h"
-
- #ifndef RUNTIME
- pascal Boolean GetScriptFilter(CInfoPBPtr pb, void * data)
- {
- #if !defined(powerc) && !defined(__powerc)
- #pragma unused(data)
- #endif
- switch (GetDocTypeFromInfo(pb)) {
- case kPreferenceDoc:
- /* We don't want preference files here. */
- case kUnknownDoc:
- return true;
- default:
- return false;
- }
- }
-
- #if USESROUTINEDESCRIPTORS
- RoutineDescriptor uGetScriptFilter =
- BUILD_ROUTINE_DESCRIPTOR(uppFileFilterYDProcInfo, GetScriptFilter);
- #else
- #define uGetScriptFilter *(FileFilterYDUPP)&GetScriptFilter
- #endif
- #else
- pascal Boolean GetScriptFilter(ParmBlkPtr info)
- {
- switch (info->fileParam.ioFlFndrInfo.fdType) {
- case 'APPL':
- switch (info->fileParam.ioFlFndrInfo.fdCreator) {
- case MPRtSig:
- return false;
- case MPAppSig:
- return !info->fileParam.ioFlLgLen;
- default:
- return true;
- }
- case 'TEXT':
- return false;
- default:
- return true;
- }
- }
- #endif
-
- #ifndef RUNTIME
-
- #define gsDebugItem 10
-
- pascal short GetScriptHook(short item, DialogPtr dlg, void * params)
- {
- short kind;
- ControlHandle dbg;
- Rect r;
- Boolean * par = (Boolean *) params;
-
- if (GetWRefCon(dlg) != 'stdf')
- return item;
-
- switch (item) {
- case sfHookFirstCall:
- *par = false;
-
- return sfHookFirstCall;
- case gsDebugItem:
- *par = !*par;
-
- GetDItem(dlg, item, &kind, (Handle *) &dbg, &r);
-
- SetCtlValue(dbg, *par);
-
- return sfHookNullEvent;
- default:
- return item;
- }
- }
-
- #if USESROUTINEDESCRIPTORS
- RoutineDescriptor uGetScriptHook =
- BUILD_ROUTINE_DESCRIPTOR(uppDlgHookYDProcInfo, GetScriptHook);
- #else
- #define uGetScriptHook *(DlgHookYDUPP)&GetScriptHook
- #endif
-
- void PopupOffending(AEDesc * repl)
- {
- OSErr err;
- AEDesc target;
- short line;
- DescType type;
- Size size;
- FSSpec file;
-
- if (AEGetParamPtr(repl, kOSAErrorOffendingObject, typeFSS, &type, &file, sizeof(FSSpec), &size))
- return;
- if (AEGetKeyDesc(repl, kOSAErrorRange, typeWildCard, &target))
- return;
- err = AEGetKeyPtr(&target, keyOSASourceStart, typeShortInteger, &type, &line, sizeof(short), &size);
- AEDisposeDesc(&target);
- if (err)
- return;
- IssueJumpCommand(&file, nil, line);
- }
-
- static void SendScriptEvent(
- DescType argType,
- Ptr argPtr,
- Handle argHdl,
- Size argSize,
- Boolean debug)
- {
- OSErr err;
- AppleEvent cmd, repl;
- AEAddressDesc addr;
-
- if (err = MakeSelfAddress(&addr))
- goto failedAddress;
-
- if (err =
- AECreateAppleEvent(
- kAEMiscStandards, kAEDoScript, &addr,
- kAutoGenerateReturnID, kAnyTransactionID,
- &cmd)
- )
- goto failedAppleEvent;
-
- if (argHdl) {
- HLock(argHdl);
- argPtr = *argHdl;
- }
-
- if (err = AEPutParamPtr(&cmd, keyDirectObject, argType, argPtr, argSize))
- goto failedParam;
-
- if (debug)
- if (err =
- AEPutParamPtr(
- &cmd, 'DEBG',
- typeBoolean, (Ptr) &debug, sizeof(Boolean))
- )
- goto failedParam;
-
- if (AESend(&cmd, &repl,
- kAEWaitReply+kAEAlwaysInteract, kAENormalPriority, kAEDefaultTimeout,
- nil, nil)
- && !gQuitting
- )
- PopupOffending(&repl);
-
- AEDisposeDesc(&repl);
- failedParam:
- if (argHdl)
- HUnlock(argHdl);
-
- AEDisposeDesc(&cmd);
- failedAppleEvent:
- AEDisposeDesc(&addr);
- failedAddress:
- ;
- }
-
- pascal void DoScriptMenu(short theItem)
- {
- StandardFileReply reply;
- Point where;
- Boolean debug;
-
- where.h = where.v = -1;
-
- BuildSEList();
-
- switch (theItem) {
- case pmRun:
- CustomGetFile(
- &uGetScriptFilter,
- MacPerlFileTypeCount,
- MacPerlFileTypes,
- &reply,
- GetScriptDialog,
- where,
- &uGetScriptHook,
- (ModalFilterYDUPP) nil,
- nil,
- (ActivateYDUPP) nil,
- &debug);
- if (reply.sfGood)
- SendScriptEvent(typeFSS, (Ptr) &reply.sfFile, nil, sizeof(FSSpec), debug);
- break;
- case pmRunFront:
- {
- DPtr doc = DPtrFromWindowPtr(FrontWindow());
-
- if (!doc || doc->kind != kDocumentWindow)
- break;
-
- if (doc->dirty || !doc->u.reg.everSaved) {
- if (doc->u.reg.everSaved)
- strcpy(gPseudoFileName, FSp2FullPath(&doc->theFSSpec));
- else
- getwtitle(FrontWindow(), gPseudoFileName);
-
- SendScriptEvent(
- typeChar, nil, (*doc->theText)->hText,
- GetHandleSize((*doc->theText)->hText),
- false);
- } else {
- gPseudoFileName[0] = 0;
- SendScriptEvent(typeFSS, (Ptr) &doc->theFSSpec, nil, sizeof(FSSpec), false);
- }
- }
- break;
- }
- }
-
- #endif
-
- typedef void (*atexitfn)();
-
- void MP_Exit(int status)
- {
- if (gRunningPerl)
- longjmp(gExitPerl, -status-1);
- else {
- exit(status);
- }
- }
-
- static atexitfn PerlExitFn[20];
- static int PerlExitCnt;
-
- int MP_AtExit(atexitfn func)
- {
- if (gRunningPerl)
- PerlExitFn[PerlExitCnt++] = func;
- else {
- return atexit(func);
- }
-
- return 0;
- }
-
- static char ** PerlArgs;
- static int PerlArgMax;
- static char ** PerlEnviron;
- static Handle PerlEnvText;
- static char * DefaultPerlEnviron = "=PERLDB=require \"macperldb.pl\"";
- static int DefaultPerlEnvLen;
-
- char * MP_GetEnv(const char * var)
- {
- char ** env;
-
- for (env = PerlEnviron; *env; ++env)
- if (!strcmp(*env, var))
- return *env + strlen(*env) + 1;
-
- return nil;
- }
-
- #if defined(powerc) || defined(__powerc)
- extern void *(*DB_calloc)(size_t nmemb, size_t size);
- extern void (*DB_free)(void *ptr);
- extern void *(*DB_malloc)(size_t size);
- extern void *(*DB_realloc)(void *ptr, size_t size);
- extern void *ice_calloc(size_t nmemb, size_t size);
- extern void ice_free(void *ptr);
- extern void *ice_malloc(size_t size);
- extern void *ice_realloc(void *ptr, size_t size);
- #endif
-
- pascal void InitPerlEnviron()
- {
- DefaultPerlEnvLen = strlen(DefaultPerlEnviron) + 1;
- *strrchr(DefaultPerlEnviron, '=') = 0;
- *strchr(DefaultPerlEnviron, '=') = 0;
-
- gDebugLogName = "Dev:Console:Debug Log";
- gExit = MP_Exit;
- gAtExit = MP_AtExit;
- gGetEnv = MP_GetEnv;
- gAlwaysExtract = true;
- gHandleEvent = HandleEvent;
- #if defined(powerc) || defined(__powerc)
- gCAlloc = ice_calloc;
- gFree = ice_free;
- gMalloc = ice_malloc;
- gRealloc = ice_realloc;
- DB_calloc = ice_calloc;
- DB_free = ice_free;
- DB_malloc = ice_malloc;
- DB_realloc = ice_realloc;
- #endif
- }
-
- Handle MakeLibraries()
- {
- int libCount;
- short resFile;
- Handle libs;
- Str255 lib;
-
- PtrToHand("PERLLIB", &libs, 8);
-
- resFile = CurResFile();
- UseResFile(gPrefsFile);
-
- for (libCount = 1; ; ++libCount) {
- GetIndString(lib, LibraryPaths, libCount);
-
- if (!lib[0])
- break;
-
- if (libCount > 1)
- PtrAndHand(",", libs, 1);
-
- PtrAndHand(lib+1, libs, lib[0]);
- }
-
- UseResFile(resFile);
-
- return libs;
- }
-
- /* Build environment from AEDescriptor passed in 'ENVT' parameter */
-
- void MakePerlEnviron(AEDesc * desc)
- {
- Handle envText = MakeLibraries();
- int index;
- int libOffset= 8;
- int dbOffset = GetHandleSize(envText)+8;
- int totalLength;
- int envCount = 2;
- void * curName;
- void * curValue;
- long curNameLen;
- long curValueLen;
- char * text;
- AEKeyword key;
- AESubDesc strings;
- AESubDesc cur;
-
- PtrAndHand(DefaultPerlEnviron, envText, DefaultPerlEnvLen);
-
- if (desc) {
- HLock(desc->dataHandle);
- AEDescToSubDesc(desc, &strings);
-
- for (index = 0; !AEGetNthSubDesc(&strings, ++index, &key, &cur); ) {
- curName = AEGetSubDescData(&cur, &curNameLen);
-
- if (AEGetNthSubDesc(&strings, ++index, &key, &cur))
- curValue = nil;
- else
- curValue = AEGetSubDescData(&cur, &curValueLen);
-
- if (curNameLen == 7 && !memcmp(curName, "PERLLIB", 7)) {
- if (curValue) {
- Munger(envText, libOffset, nil, 0, curValue, curValueLen+1);
- (*envText)[libOffset+curValueLen] = ',';
- dbOffset += curValueLen+1;
- }
- } else if (curNameLen == 6 && !memcmp(curName, "PERLDB", 6)) {
- if (curValue)
- Munger(
- envText, dbOffset,
- nil, strlen(*envText)+dbOffset, curValue, curValueLen+1);
- } else {
- ++envCount;
-
- totalLength = GetHandleSize(envText);
-
- PtrAndHand(curName, envText, curNameLen+1);
-
- (*envText)[totalLength+curNameLen] = 0;
-
- if (curValue) {
- PtrAndHand(curValue, envText, curValueLen+1);
-
- (*envText)[totalLength+curNameLen+curValueLen+1] = 0;
- } else {
- PtrAndHand(curName, envText, 1);
-
- (*envText)[totalLength+curNameLen+1] = 0;
- }
- }
- }
- }
-
- if (PerlEnvText) {
- DisposePtr((Ptr) PerlEnviron);
- DisposeHandle(PerlEnvText);
- }
-
- MoveHHi(PerlEnvText = envText);
- HLock(envText);
-
- PerlEnviron = (char **) NewPtr((envCount+1) * sizeof(char *));
- PerlEnviron[envCount] = nil;
- text = *envText;
-
- while (envCount--) {
- PerlEnviron[envCount] = text;
- text += strlen(text) + 1;
- text += strlen(text) + 1;
- }
- }
-
- void CleanupPerl()
- {
- int i;
- extern FILE * _lastbuf;
-
- UseResFile(gAppFile);
-
- // Borrowed from GUSI
-
- // Close stdio files (necessary to flush buffers)
- // This implementation is not nice, but who cares ?
- // In case you wonder, _iob is defined in <stdio.h>
-
- fwalk(fflush);
- fwalk(fclose);
-
- // Close all files
-
- for (i = 0; i<FD_SETSIZE; ++i)
- close(i);
-
- while (PerlExitCnt)
- PerlExitFn[--PerlExitCnt]();
-
- UseResFile(gAppFile);
-
- reenter();
-
- freopen("Dev:Console", "r", stdin);
- freopen("Dev:Console", "w", stdout);
- freopen("Dev:Console", "w", stderr);
-
- stderr->_flag |= _IOLBF;
- }
-
- enum {
- extractDone = -4,
- extractDir = -3,
- extractCpp = -2,
- extractDebug = -1
- };
-
- typedef char * (*ArgExtractor)(void * data, int index);
-
- pascal Boolean RunScript(ArgExtractor extractor, void * data)
- {
- int ArgC;
- char * res;
- int i;
- int DynamicArgs;
- int returnCode;
-
- ArgC = 1;
- PerlArgMax = 20;
- PerlArgs = malloc(PerlArgMax * sizeof(char *));
- PerlArgs[0] = "MacPerl";
-
- {
- char path[256];
-
- strcpy(path, extractor(data, extractDir));
- chdir(path);
- }
-
- if ((res = extractor(data, extractDebug)) && *res == 'y')
- PerlArgs[ArgC++] = "-d";
-
- if ((res = extractor(data, extractCpp)) && *res == 'y')
- PerlArgs[ArgC++] = "-P";
-
- DynamicArgs = ArgC;
-
- if (res = extractor(data, 1)) {
- if (gPerlPrefs.checkType && !gPseudoFile)
- PerlArgs[ArgC++] = "-x";
-
- DynamicArgs = ArgC;
-
- PerlArgs[ArgC++] = res;
-
- for (i=2; PerlArgs[ArgC] = extractor(data, i); ++i)
- if (++ArgC == PerlArgMax) {
- PerlArgMax += 20;
- PerlArgs = realloc(PerlArgs, PerlArgMax * sizeof(char *));
- }
- }
-
- extractor(data, extractDone);
-
- UseResFile(gAppFile);
-
- PerlArgs[ArgC] = nil;
- gRunningPerl = true;
- gPerlQuit = 0;
- gFirstErrorLine= -1;
-
- ShowWindowStatus();
-
- signal(SIGINT, exit);
-
- if (!(returnCode = setjmp(gExitPerl))) {
- run_perl(ArgC, PerlArgs, PerlEnviron);
- /* Noone here gets out alive */
- }
-
- for (i=DynamicArgs; PerlArgs[i]; ++i)
- DisposPtr(PerlArgs[i]);
-
- free(PerlArgs);
-
- CleanupPerl();
- gRunningPerl = false;
-
- if (gScriptFile != gAppFile) {
- CloseResFile(gScriptFile);
-
- gScriptFile = gAppFile;
- }
-
- ShowWindowStatus();
-
- ++gCompletedScripts;
-
- switch (gPerlQuit) {
- case 3:
- if (gCompletedScripts > 1)
- break;
- /* Otherwise, we were the cause of MacPerl being run, let's quit */
- case 2:
- #ifdef RUNTIME
- case 1:
- #endif
- DoQuit(kAEAsk);
- }
-
- return returnCode == -1;
- }
-
- char * MakePath(char * path)
- {
- char * retarg = NewPtr(strlen(path)+1);
-
- if (retarg)
- strcpy(retarg, path);
-
- return retarg;
- }
-
- char * AEExtractor(void * data, int index)
- {
- static Boolean hasParams = false;
- static AEDesc params;
- static AESubDesc paramList;
- static int scriptIndex;
-
- AppleEvent * event;
- AESubDesc sd;
- AEKeyword noKey;
- AEDesc desc;
- FSSpec script;
- FSSpec arg;
- Size size;
- char * retarg;
- DescType type;
- Boolean flag;
-
- event = (AppleEvent *) data;
-
- if (!hasParams) {
- AEGetParamDesc(event, keyDirectObject, typeAEList, ¶ms);
- AEDescToSubDesc(¶ms, ¶mList);
- hasParams = true;
- scriptIndex = 0;
-
- if (gRuntimeScript)
- gPseudoFile = gRuntimeScript;
- else
- while (!AEGetNthSubDesc(¶mList, ++scriptIndex, &noKey, &sd)) {
- if (!AESubDescToDesc(&sd, typeFSS, &desc)) {
- script = **(FSSpec **) desc.dataHandle;
-
- AEDisposeDesc(&desc);
-
- break;
- }
- if (AESubDescToDesc(&sd, typeChar, &desc))
- continue;
- if ((*desc.dataHandle)[0] == '-') {
- AEDisposeDesc(&desc);
-
- continue;
- } else {
- if (!gPseudoFileName[0])
- strcpy(gPseudoFileName, "<AppleEvent>");
- gPseudoFile = desc.dataHandle;
-
- break;
- }
- }
- }
-
- switch (index) {
- case extractDone:
- gRuntimeScript = nil;
-
- if (hasParams)
- AEDisposeDesc(¶ms);
-
- hasParams = false;
-
- return nil;
- case extractDir:
- if (gPseudoFile) {
- script.vRefNum = gAppVol;
- script.parID = gAppDir;
- } else {
- short res = CurResFile();
-
- gScriptFile = HOpenResFile(script.vRefNum, script.parID, script.name, fsRdPerm);
-
- if (gPseudoFile = Get1NamedResource('TEXT', (StringPtr) "\p!")) {
- strcpy(gPseudoFileName, FSp2FullPath(&script));
-
- DetachResource(gPseudoFile);
- }
-
- UseResFile(res);
- }
-
- FSpUp(&script);
-
- return FSp2FullPath(&script);
- case extractDebug:
- if (AEGetParamPtr(event, 'DEBG', typeBoolean, &type, (Ptr) &flag, 1, &size))
- return nil;
- else
- return flag ? "y" : "n";
- case extractCpp:
- if (AEGetParamPtr(event, 'PREP', typeBoolean, &type, (Ptr) &flag, 1, &size))
- return nil;
- else
- return flag ? "y" : "n";
- default:
- /* A runtime script inserts itself at the beginning */
- if (gRuntimeScript)
- --index;
-
- if (index == scriptIndex && gPseudoFile)
- return MakePath("Dev:Pseudo");
-
- /* End of list ? */
- if (AEGetNthSubDesc(¶mList, index, &noKey, &sd))
- return nil;
-
- if (!AESubDescToDesc(&sd, typeFSS, &desc)) {
- arg = **(FSSpec **) desc.dataHandle;
-
- AEDisposeDesc(&desc);
-
- /* A file, convert to a path name */
- retarg = FSp2FullPath(&arg);
-
- return MakePath(retarg);
- } else if (!AESubDescToDesc(&sd, typeChar, &desc)) {
- size = GetHandleSize(desc.dataHandle);
- retarg = NewPtr(size+1);
-
- if (retarg) {
- retarg[size] = 0;
-
- memcpy(retarg, *desc.dataHandle, size);
- }
-
- AEDisposeDesc(&desc);
-
- return retarg;
- }
-
- return nil;
- }
- }
-
- char * StupidExtractor(void * data, int index)
- {
- FSSpec * spec;
- FSSpec dir;
- char * retarg;
- char * path;
-
- spec = (FSSpec *) data;
-
- switch (index) {
- case extractDone:
- case extractDebug:
- case extractCpp:
- return nil;
- case extractDir:
- dir = *spec;
-
- {
- short res = CurResFile();
-
- gScriptFile = HOpenResFile(dir.vRefNum, dir.parID, dir.name, fsRdPerm);
-
- if (gPseudoFile = Get1NamedResource('TEXT', (StringPtr) "\p!")) {
- strcpy(gPseudoFileName, FSp2FullPath(spec));
-
- DetachResource(gPseudoFile);
- }
-
- UseResFile(res);
- }
-
- FSpUp(&dir);
-
- return FSp2FullPath(&dir);
- default:
- if (index > 1)
- return nil;
-
- if (gPseudoFile)
- return "Dev:Pseudo";
-
- path = FSp2FullPath(spec);
- retarg = NewPtr(strlen(path)+1);
-
- strcpy(retarg, path);
-
- return retarg;
- }
- }
-
- #ifdef RUNTIME
-
- char * YeOldeExtractor(void * data, int index)
- {
- long count;
- char * retarg;
- char * path;
- FSSpec spec;
- AppFile arg;
-
- count = (long) data;
-
- switch (index) {
- case extractDone:
- gRuntimeScript = nil;
- case extractDebug:
- case extractCpp:
- return nil;
- case extractDir:
- if (gRuntimeScript) {
- spec.vRefNum = gAppVol;
- spec.parID = gAppDir;
- } else {
- short res = CurResFile();
-
- GetAppFiles(1, &arg);
-
- WD2FSSpec(arg.vRefNum, arg.fName, &spec);
-
- gScriptFile = HOpenResFile(spec.vRefNum, spec.parID, spec.name, fsRdPerm);
-
- if (gPseudoFile = Get1NamedResource('TEXT', (StringPtr) "\p!")) {
- strcpy(gPseudoFileName, FSp2FullPath(&spec));
-
- DetachResource(gPseudoFile);
- }
-
- UseResFile(res);
- }
-
- FSpUp(&spec);
-
- return FSp2FullPath(&spec);
- default:
- if (index - (gRuntimeScript != 0) > count)
- return nil;
-
- if (gRuntimeScript)
- --index;
- else if (index == 1 && gPseudoFile)
- return "Dev:Pseudo";
-
- if (!index) {
- gPseudoFile = gRuntimeScript;
-
- return "Dev:Pseudo";
- }
-
- GetAppFiles(index, &arg);
-
- WD2FSSpec(arg.vRefNum, arg.fName, &spec);
-
- path = FSp2FullPath(&spec);
- retarg = NewPtr(strlen(path)+1);
-
- strcpy(retarg, path);
-
- return retarg;
- }
- }
- #endif
-
- void AddErrorDescription(AppleEvent * reply)
- {
- OSErr err;
- AliasHandle file;
- AEStream aes;
- AEDesc newDesc;
- short line;
-
- if (gFirstErrorLine == -1 || reply->descriptorType == typeNull)
- return;
-
- line = (short) gFirstErrorLine;
-
- if (NewAlias(nil, &gFirstErrorFile, &file))
- return;
-
- HLock((Handle) file);
- err = AEPutParamPtr(
- reply, kOSAErrorOffendingObject,
- typeAlias, (Ptr) *file, GetHandleSize((Handle) file));
- DisposHandle((Handle) file);
-
- if (err)
- return;
-
- if (AEStream_Open(&aes))
- return;
-
- if (AEStream_OpenRecord(&aes, typeAERecord)
- || AEStream_WriteKeyDesc(&aes, keyOSASourceStart, typeShortInteger, (Ptr) &line, 2)
- || AEStream_WriteKeyDesc(&aes, keyOSASourceEnd, typeShortInteger, (Ptr) &line, 2)
- || AEStream_CloseRecord(&aes)
- || AEStream_Close(&aes, &newDesc)
- ) {
- AEStream_Close(&aes, nil);
- } else {
- AEPutParamDesc(reply, kOSAErrorRange, &newDesc) ;
- AEDisposeDesc(&newDesc);
- }
- }
-
- pascal OSErr DoScript(const AppleEvent *event, AppleEvent *reply, long refCon)
- {
- #if !defined(powerc) && !defined(__powerc)
- #pragma unused (refCon)
- #endif
- Boolean ranOK;
- OSType mode;
- DescType typeCode;
- Size size;
- AEDesc env;
-
- if (gRunningPerl) {
- const AppleEvent * e[2];
-
- e[0] = event;
- e[1] = reply;
-
- PtrAndHand((Ptr) e, (Handle) gWaitingScripts, 8);
-
- return AESuspendTheCurrentEvent(event);
- }
-
- if (AEGetParamPtr(event, 'MODE', typeEnumerated, &typeCode, &mode, 4, &size))
- mode = 'LOCL';
-
- switch (mode) {
- case 'RCTL':
- if (reply) { /* Return immediately from initial request */
- AEDuplicateDesc(event, &gDelayedScript);
-
- return 0;
- }
-
- /* Fall through on delayed request */
- case 'BATC':
- Relay(event, nil, mode);
-
- freopen("Dev:AEVT", "r", stdin);
- freopen("Dev:AEVT", "w", stdout);
- freopen("Dev:AEVT:diag", "w", stderr);
-
- stderr->_flag |= _IOLBF;
- }
-
- if (AEGetParamDesc(event, 'ENVT', typeAEList, &env))
- MakePerlEnviron(nil);
- else {
- MakePerlEnviron(&env);
- AEDisposeDesc(&env);
- }
-
- ranOK = RunScript(AEExtractor, (void *) event);
-
- switch (mode) {
- case 'RCTL':
- /* Provoke controller to send last data event */
- if (!gQuitting)
- FlushAEVTs(nil);
- break;
- case 'BATC':
- case 'LOCL':
- /* Get output data into reply event */
- FlushAEVTs(reply);
-
- if (gPerlReply) {
- HLock(gPerlReply);
- AEPutParamPtr(
- reply, keyDirectObject,
- typeChar, *gPerlReply, GetHandleSize(gPerlReply));
- DisposeHandle(gPerlReply);
- gPerlReply = nil;
- }
-
- AddErrorDescription(reply);
- }
-
- return ranOK ? 0 : (gSyntaxError ? 1 : 2);
- }
-
- #ifdef RUNTIME
-
- pascal void DoScriptMenu(short theItem)
- {
- switch (theItem) {
- case pmRun:
- {
- Point wh;
- SFTypeList types;
- SFReply reply;
- FSSpec spec;
-
- wh.h = wh.v = 75;
- types[0] = 'TEXT';
- types[1] = 'APPL';
-
- SFGetFile(wh, "", (FileFilterUPP) GetScriptFilter, 2, types, (DlgHookProcPtr) nil, &reply);
-
- if (reply.good) {
- WD2FSSpec(reply.vRefNum, reply.fName, &spec);
-
- MakePerlEnviron(nil);
- RunScript(StupidExtractor, &spec);
- }
- }
- break;
- case pmRunFront:
- {
- DPtr doc = DPtrFromWindowPtr(FrontWindow());
-
- if (!doc || doc->kind != kDocumentWindow)
- break;
-
- MakePerlEnviron(nil);
-
- if (doc->dirty || !doc->u.reg.everSaved) {
- gRuntimeScript = (*doc->theText)->hText;
-
- HandToHand(&gRuntimeScript);
-
- if (doc->u.reg.everSaved)
- strcpy(gPseudoFileName, FSp2FullPath(&doc->theFSSpec));
- else
- getwtitle(FrontWindow(), gPseudoFileName);
-
- RunScript(YeOldeExtractor, (void *) 0);
- } else
- RunScript(StupidExtractor, &doc->theFSSpec);
- }
- break;
- }
- }
- #endif
-
- pascal Boolean DoRuntime()
- {
- short message;
- short count;
- FSSpec spec;
-
- if (gRuntimeScript = Get1NamedResource('TEXT', (StringPtr) "\p!")) {
- spec.vRefNum = gAppVol;
- spec.parID = gAppDir;
- PLstrcpy(spec.name, LMGetCurApName());
- strcpy(gPseudoFileName, FSp2FullPath(&spec));
-
- DetachResource(gRuntimeScript);
- }
-
- #ifndef RUNTIME
- return false;
- #else
- if (gAppleEventsImplemented)
- return false;
-
- CountAppFiles(&message, &count);
-
- if (count) {
- if (message == appPrint) {
- int i;
- AppFile arg;
-
- for (i=0; i++<count; ) {
- GetAppFiles(i, &arg);
-
- WD2FSSpec(arg.vRefNum, arg.fName, &spec);
-
- if (!IssueAEOpenDoc(spec)) {
- IssuePrintWindow(FrontWindow());
- IssueCloseCommand(FrontWindow());
- }
- }
-
- return true;
- }
- } else {
- if (!gRuntimeScript) {
- int i;
- AppFile arg;
-
- for (i=0; i++<count; ) {
- GetAppFiles(i, &arg);
-
- WD2FSSpec(arg.vRefNum, arg.fName, &spec);
-
- IssueAEOpenDoc(spec);
- }
-
- return false;
- }
- }
-
- MakePerlEnviron(nil);
- RunScript(YeOldeExtractor, (void *) count);
-
- return gQuitting;
- #endif
- }
-